home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1996
/
MacHack 1996.toast
/
Presentations
/
Presentations ’94
/
Timothy Knox
/
Pocket6.3
/
Examples
/
Graphics
< prev
next >
Wrap
Text File
|
1994-06-24
|
6KB
|
147 lines
( Grafics words for Pocket Forth 0.6 )
forget task : task ; decimal
0 28 +md ! page
( create named rects )
: RECT ( compile: -- ) ( run: -- addr ) variable 6 allot ;
( rect words work on any 8 bytes )
: !RECT ( t l b r rect -- ) >r swap r 4 + 2! swap r> 2! ;
: @RECT ( rect -- t l b r ) dup 2@ swap rot 4 + 2@ swap ;
: @TL ( rect -- t l ) @rect 2drop ;
: RCENTER ( rect -- h v ) @rect >r swap >r ( -- tb r: -- rl )
over - 2 / + 2r> dup rot swap - 2 / + swap ;
: RCLIP ( rect -- ) a>r ,$ A87B ; ( _ClipRect )
: RINVALID ( rect -- ) a>r ,$ A928 ; ( _InvalRect )
: ROFFSET ( h v rect -- ) a>r 2>r ,$ A8A8 ; ( _OffsetRect )
: RINSET ( h v rect -- ) a>r 2>r ,$ A8A9 ; ( _InsetRect )
: ?IN ( h v rect -- flag ) ( true if h,v is in rect at addr )
0 >r rot rot 2>r a>r ,$ A8AD r> ; ( _PtInRect )
: ?EMPTY ( rect -- flag ) 0 >r a>r ,$ A8AE r> ; ( _EmptyRect )
( rect drawing )
: RFRAME ( rect -- ) a>r ,$ A8A1 ; ( _FrameRect )
: OFRAME ( rect -- ) a>r ,$ A8B7 ; ( _FrameOval )
: RERASE ( rect -- ) a>r ,$ A8A3 ; ( _EraseRect )
: OERASE ( rect -- ) a>r ,$ A8B9 ; ( _EraseOval )
: RINVERT ( rect -- ) a>r ,$ A8A4 ; ( _InvertRect )
: OINVERT ( rect -- ) a>r ,$ A8BA ; ( _InvertOval )
: RPAINT ( rect -- ) a>r ,$ A8A2 ; ( _PaintRect )
: OPAINT ( rect -- ) a>r ,$ A8B8 ; ( _PaintOval )
( Read PICT resources from a file on disk ) ( If the pictures ... )
( ... are in the current file, only getpict need be called. )
variable #REF ( resource file reference number )
: ROPEN ( addr -- ) ( rel addr of the file/path name )
0 >r a>r ,$ A997 r> #ref ! ; ( _OpenResFile )
: RCLOSE ( -- ) ( always close after each opening )
#ref @ >r ,$ A99A 0 #ref ! ; ( _CloseResFile )
: GETPICT ( id -- dhandle ) 0 0 2>r >r ,$ A9BC 2r> ; ( _GetPict )
( create pictures )
: PICTURE ( rect -- dhandle ) ( start a picture definition )
0 0 2>r a>r ,$ A8F3 2r> ; ( _OpenPicture )
: PCLOSE ,$ A8F4 ; macro ( _ClosePicture )
: PKILL ( addr -- ) 2@ 2>r ,$ A8F5 ; ( _KillPicture at addr )
( display pictures )
: PRECT ( dhandle -- t l b r ) ( the Picture RECT )
dl@ 2dup 2 0 d+ dl@ 2swap 6 0 d+ dl@ ;
: PSIZE ( dhandle -- h v ) prect rot - abs rot rot - abs ;
: DPICT ( dhandle h v -- ) ( draw a picture in its own rect )
2over psize 2over d+ here !rect
2>r here a>r ,$ A8F6 ; ( _DrawPicture )
: PDRAW ( rect dhandle -- ) ( draw a picture in a rect )
2>r a>r ,$ A8F6 ; ( _DrawPicture )
( regions ) ( keep the handle on the stack "dhandle" )
: REGION ( -- dhandle ) ( create an open region, deliver a handle )
0 0 2>r ,$ A8D8 2r> ,$ A8DA ; ( _NewRgn _OpenRgn )
: RGCLOSE ( dhandle -- ) 2>r ,$ A8DB ; macro ( _CloseRgn )
: RGDISP ( dhandle -- ) 2>r ,$ A8D9 ; macro ( _DisposRgn )
: RGCLIP ( dhandle -- ) 2>r ,$ A879 ; macro ( _SetClip )
: ?RGIN ( dhandle h v -- flag ) ( true if h,v is in region at dhandle )
0 >r 2>r 2>r ,$ A8E8 r> ; ( _PtInRegion )
( region drawing )
: RGFRAME ( dhandle -- ) 2>r ,$ A8D2 ; macro ( _FrameRgn )
: RGERASE ( dhandle -- ) 2>r ,$ A8D4 ; macro ( _EraseRgn )
: RGINVERT ( dhandle -- ) 2>r ,$ A8D5 ; macro ( _InvertRgn )
( font words )
: !FONT ( n -- ) >r ,$ A887 ; macro ( _TextFont ) ( set font )
: !FSIZE ( n -- ) >r ,$ A88A ; macro ( _TextSize ) ( set size )
: !FACE ( face -- ) >r ,$ A888 ; macro ( _TextFace ) ( set style )
: !FMODE ( mode -- ) >r ,$ A889 ; macro ( _TextMode ) ( set mode )
: SFONT ( -- ) 0 !font 12 !fsize ; ( set System font )
: NFONT ( -- ) 4 !font 09 !fsize 0 !fmode ; ( set Normal font )
( Polygons ) ( keep the handle in a 2variable "poly" )
: NPOLY ( poly -- ) 0 0 2>r ,$ A8CB 2r> rot 2! ; ( _OpenPoly )
: CPOLY ( -- ) ,$ A8CC ; macro ( _ClosePgon )
: FPOLY ( poly -- ) 2@ 2>r ,$ A8C6 ; ( _FramePoly )
: EPOLY ( poly -- ) 2@ 2>r ,$ A8C8 ; ( _ErasePoly )
: KPOLY ( poly -- ) 2@ 2>r ,$ A8CD ; ( _KillPoly )
: ?PHIT ( h v poly -- flag ) ( true if h,v is in polyBBox )
0 >r 2@ dl@ 2 0 d+ 2swap 2>r 2>r ,$ A8AD r> ; ( _PtInRect )
( old style colors )
33 constant BLACK 30 constant WITE
205 constant RED 341 constant GREEN
409 constant BLUE 273 constant CYAN
137 constant MAGENTA 69 constant YELLOW
: FCOLOR ( color.code -- ) 0 2>r ,$ A862 ; ( _ForeColor )
: BCOLOR ( back.color -- ) 0 2>r ,$ A863 ; ( _BackColor )
( A demonstration )
: DEMO ; ( The infamous Mondrian program w/ enhancement )
\ Random numbers
: SEED ( -- daddr ) ,$ 2d15 126 0 dnegate d+ ;
: TIME ( -- d ) 524 0 dl@ ;
: RANDOMIZE time seed dl! ;
: RANDOM ( n -- n' )
0 >r ,$ A861 r> ( _Random )
swap 32768 */ abs ; ( scale to size from stack )
: SSIZE ( -- h v ) ( screen size in pixels )
,$ 2d2d ,$ ff8c ; macro ( move.l screenBits[a5],-[ps] )
: WSIZE ( h v -- ) ( change the window size )
2dup 8 +md 2! ( set the scroll rect )
0 +md 2@ 2>r 2>r 256 >r ,$ A91D ; ( _SizeWindow )
create COLORS ( use an array of old style colors )
yellow , cyan , wite , blue , yellow , wite ,
: RCOLOR 6 random 2* colors + @ ; ( pick a color at random )
rect INRECT ( drawn in rect )
rect MRECT ( the random rect )
: WIDTH inrect dup 6 + @ 50 - random swap 2+ @ + ;
: HEIGHT inrect dup 4 + @ 52 - random swap @ + ;
: DRAW ( draw a random rect in inrect )
height width height width mrect !rect ( set random rect )
rcolor fcolor mrect
7 random IF rinvert ELSE opaint THEN
750 random 0= IF inrect rerase THEN ;
: MONDRIAN ( -- )
0 +md 2@ 2>r 0 20 2>r 1 >r ,$ A91B ( _MoveWindow to top left )
ssize wsize ( set the window to full screen )
black bcolor 4 +md rerase
52 50 8 +md 2@ -53 -51 d+ swap inrect !rect ( drawing rect )
inrect rframe 1 1 inrect rinset ( make a black frame )
wite bcolor inrect rerase ( erase pane )
8 +md @ 2/ 100 - 40 !pen ( pen position for title )
3 !fmode sfont ." Press a key to end the demo."
randomize
BEGIN draw ?terminal ?button or UNTIL ( wait )
black fcolor 384 178 wsize nfont
0 +md 2@ 2>r 2 40 2>r 1 >r ,$ A91B ( _MoveWindow to normal )
page ." Graphics words are loaded." cr ;
mondrian
forget demo -1 28 +md !